package com.sky.handler;

import com.sky.constant.MessageConstant;
import com.sky.exception.BaseException;
import com.sky.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * 全局异常处理器，处理项目中抛出的业务异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 捕获业务异常
     *
     * @param ex
     * @return
     */
    //这个异常处理器用于捕获所有继承自BaseException的异常。BaseException通常是你自定义的一个异常基类，
    // 用于处理业务逻辑中的特定异常。这个处理器会记录异常信息，并返回一个包含异常消息的Result对象。
    @ExceptionHandler
    public Result exceptionHandler(BaseException ex) {
        log.error("异常信息：{}", ex.getMessage());
        return Result.error(ex.getMessage());
    }


    //全局异常处理器：会处理 BaseException 及其子类（如 PasswordErrorException）的异常。
    //自定义异常基类 BaseException：提供了无参和带参数的构造方法，允许在抛出异常时提供具体的错误消息。
    //具体的异常类型 PasswordErrorException：继承自 BaseException，同样提供了无参和带参数的构造方法，允许在抛出异常时提供具体的错误消息。
    //异常处理流程：在业务逻辑中抛出 PasswordErrorException，并通过全局异常处理器捕获并处理。



    @ExceptionHandler
    public Result exceptionHandler(SQLIntegrityConstraintViolationException ex) {
        String message = ex.getMessage();
        if (message.contains("Duplicate entry")) {
            String[] split = message.split(" ");
            String username = split[2];
            String msg = username + MessageConstant.ACCOUNT_ALREADY_EXISTS;
            return Result.error(msg);
        }else{
            return Result.error(MessageConstant.UNKNOWN_ERROR);
        }
    }

}


